package com.example.zzh.controller;

import com.example.zzh.entity.*;
import com.example.zzh.service.ZzhOrganizationService;
import com.example.zzh.service.ZzhRoleService;
import com.example.zzh.service.ZzhStaffService;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.poi.ss.usermodel.RichTextString;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 功能描述
 *
 * @author: ZhangZhenHao
 * @date: 2024年01月11日 17:30
 */
@RestController
@RequestMapping("/zzh-excel")
public class ExcelController {

    @Autowired
    ZzhOrganizationService zzhOrganizationService;

    @Autowired
    private ZzhRoleService zzhRoleService;

    @Autowired
    private ZzhStaffService zzhStaffService;

    /**
     * 导出站点信息
     * @param tableData
     * @return
     * @throws IOException
     */
    @PostMapping(value = "/produceExcel", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    public ResponseEntity<byte[]> exportExcelStation(@RequestBody List<ZzhProductInfo> tableData) throws IOException {
        // 创建Excel工作簿和工作表
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("数据表");

        // 添加数据到工作表
        Row headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue("id");
        headerRow.createCell(1).setCellValue("名称");
        headerRow.createCell(2).setCellValue("制造商");
        headerRow.createCell(3).setCellValue("型号");
        headerRow.createCell(4).setCellValue("规格");
        headerRow.createCell(5).setCellValue("颜色");
        headerRow.createCell(6).setCellValue("单位-单个");
        headerRow.createCell(7).setCellValue("备注");

        Row dataRow;
        for (int i = 0; i < tableData.size(); i++) {
            dataRow = sheet.createRow(i + 1);
            dataRow.createCell(0).setCellValue(tableData.get(i).getId());
            dataRow.createCell(1).setCellValue(tableData.get(i).getName());
            dataRow.createCell(2).setCellValue(tableData.get(i).getMfrs());
            dataRow.createCell(3).setCellValue(tableData.get(i).getModel());
            dataRow.createCell(4).setCellValue(tableData.get(i).getStandard());
            dataRow.createCell(5).setCellValue(tableData.get(i).getColor());
            dataRow.createCell(6).setCellValue(tableData.get(i).getUnit());
            dataRow.createCell(7).setCellValue(tableData.get(i).getRemark());
        }

        // 将工作簿写入字节流(将Excel工作簿写入内存中的字节数组流中)
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        workbook.write(outputStream);

        // 设置响应头信息
        HttpHeaders headers = new HttpHeaders();
        //设置了响应的内容类型为application/octet-stream
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        //浏览器就会提示用户下载文件，并指定文件名为stationExcel.xlsx
        headers.setContentDispositionFormData("attachment", "stationExcel.xlsx");

        //使用ResponseEntity构建了一个带有响应头和响应体的HTTP响应对象。.ok()表示响应状态码为200，.headers(headers)设置了响应头
        // .body(outputStream.toByteArray())设置了响应体为outputStream中的字节数组
        return ResponseEntity.ok()
                .headers(headers)
                .body(outputStream.toByteArray());
    }

    /**
     * 导出站点信息
     * @param tableData
     * @return
     * @throws IOException
     */
    @PostMapping(value = "/staffExcel", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    public ResponseEntity<byte[]> staffExcel(@RequestBody List<ZzhStaff> tableData) throws IOException {
        List<ZzhRole> zzhRoles=zzhRoleService.list();
        List<ZzhOrganization> zzhOrganizations=zzhOrganizationService.list();

        // 创建Excel工作簿和工作表
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("数据表");

        // 添加数据到工作表
        Row headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue("id");
        headerRow.createCell(1).setCellValue("登录名称");
        headerRow.createCell(2).setCellValue("用户姓名");
        headerRow.createCell(3).setCellValue("所属部门");
        headerRow.createCell(4).setCellValue("职位");
        headerRow.createCell(5).setCellValue("手机号码");
        headerRow.createCell(6).setCellValue("电子邮箱");
        headerRow.createCell(7).setCellValue("状态");

        Row dataRow;
        for (int i = 0; i < tableData.size(); i++) {
            dataRow = sheet.createRow(i + 1);
            dataRow.createCell(0).setCellValue(tableData.get(i).getId());
            dataRow.createCell(1).setCellValue(tableData.get(i).getLoginName());
            dataRow.createCell(2).setCellValue(tableData.get(i).getUsername());
            for (ZzhOrganization organizations : zzhOrganizations) {
                if(tableData.get(i).getDepartment().equals(organizations.getId().toString())){
                    dataRow.createCell(3).setCellValue(organizations.getOrgAbr());
                }
            }
            for (ZzhRole roles : zzhRoles) {
                if(tableData.get(i).getPosition().equals(roles.getId().toString())){
                    dataRow.createCell(4).setCellValue(roles.getName());
                }
            }

            dataRow.createCell(5).setCellValue(tableData.get(i).getPhonenum());
            dataRow.createCell(6).setCellValue(tableData.get(i).getEmail());
            if(tableData.get(i).getStatus()==1){
                dataRow.createCell(7).setCellValue("正常");
            }else if(tableData.get(i).getStatus()==2){
                dataRow.createCell(7).setCellValue("封禁");
            }else {
                dataRow.createCell(7).setCellValue("删除");
            }
        }

        // 将工作簿写入字节流(将Excel工作簿写入内存中的字节数组流中)
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        workbook.write(outputStream);

        // 设置响应头信息
        HttpHeaders headers = new HttpHeaders();
        //设置了响应的内容类型为application/octet-stream
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        //浏览器就会提示用户下载文件，并指定文件名为stationExcel.xlsx
        headers.setContentDispositionFormData("attachment", "stationExcel.xlsx");

        //使用ResponseEntity构建了一个带有响应头和响应体的HTTP响应对象。.ok()表示响应状态码为200，.headers(headers)设置了响应头
        // .body(outputStream.toByteArray())设置了响应体为outputStream中的字节数组
        return ResponseEntity.ok()
                .headers(headers)
                .body(outputStream.toByteArray());
    }

    /**
     * 导出站点信息
     * @param tableData
     * @return
     * @throws IOException
     */
    @PostMapping(value = "/userExcel", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    public ResponseEntity<byte[]> userExcel(@RequestBody List<ZzhUser> tableData) throws IOException {
        // 创建Excel工作簿和工作表
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("数据表");

        // 添加数据到工作表
        Row headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue("id");
        headerRow.createCell(1).setCellValue("类型");
        headerRow.createCell(2).setCellValue("供应商-用户名称");
        headerRow.createCell(3).setCellValue("联系人");
        headerRow.createCell(4).setCellValue("电子邮箱");
        headerRow.createCell(5).setCellValue("手机");
        headerRow.createCell(6).setCellValue("地址");
        headerRow.createCell(7).setCellValue("备注");
        headerRow.createCell(8).setCellValue("状态");

        Row dataRow;
        for (int i = 0; i < tableData.size(); i++) {
            dataRow = sheet.createRow(i + 1);
            dataRow.createCell(0).setCellValue(tableData.get(i).getId());
            dataRow.createCell(1).setCellValue(tableData.get(i).getType());
            dataRow.createCell(2).setCellValue(tableData.get(i).getName());
            dataRow.createCell(3).setCellValue(tableData.get(i).getContacts());
            dataRow.createCell(4).setCellValue(tableData.get(i).getEmail());
            dataRow.createCell(5).setCellValue(tableData.get(i).getTelephone());
            dataRow.createCell(6).setCellValue(tableData.get(i).getAddress());
            dataRow.createCell(7).setCellValue(tableData.get(i).getDescription());
            if(tableData.get(i).getStatus()==1){
                dataRow.createCell(8).setCellValue("正常");
            }else if(tableData.get(i).getStatus()==2){
                dataRow.createCell(8).setCellValue("封禁");
            }else {
                dataRow.createCell(8).setCellValue("删除");
            }
        }

        // 将工作簿写入字节流(将Excel工作簿写入内存中的字节数组流中)
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        workbook.write(outputStream);

        // 设置响应头信息
        HttpHeaders headers = new HttpHeaders();
        //设置了响应的内容类型为application/octet-stream
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        //浏览器就会提示用户下载文件，并指定文件名为stationExcel.xlsx
        headers.setContentDispositionFormData("attachment", "stationExcel.xlsx");

        //使用ResponseEntity构建了一个带有响应头和响应体的HTTP响应对象。.ok()表示响应状态码为200，.headers(headers)设置了响应头
        // .body(outputStream.toByteArray())设置了响应体为outputStream中的字节数组
        return ResponseEntity.ok()
                .headers(headers)
                .body(outputStream.toByteArray());
    }

    /**
     * 导出站点信息
     * @param tableData
     * @return
     * @throws IOException
     */
    @PostMapping(value = "/depotExcel", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    public ResponseEntity<byte[]> depotExcel(@RequestBody List<ZzhDepot> tableData) throws IOException {
        List<ZzhStaff> zzhStaffs=zzhStaffService.list();
        for (ZzhStaff i : zzhStaffs) {

        }
        // 创建Excel工作簿和工作表
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("数据表");

        // 添加数据到工作表
        Row headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue("id");
        headerRow.createCell(1).setCellValue("仓库名称");
        headerRow.createCell(2).setCellValue("仓库地址");
        headerRow.createCell(3).setCellValue("描述");
        headerRow.createCell(4).setCellValue("负责人");
        headerRow.createCell(5).setCellValue("状态");

        Row dataRow;
        for (int i = 0; i < tableData.size(); i++) {
            dataRow = sheet.createRow(i + 1);
            dataRow.createCell(0).setCellValue(tableData.get(i).getId());
            dataRow.createCell(1).setCellValue(tableData.get(i).getName());
            dataRow.createCell(2).setCellValue(tableData.get(i).getAddress());
            dataRow.createCell(3).setCellValue(tableData.get(i).getRemark());
            for (ZzhStaff zzhStaff : zzhStaffs) {
                if(tableData.get(i).getPrincipal()==zzhStaff.getId()){
                    dataRow.createCell(4).setCellValue(zzhStaff.getUsername());
                }
            }
            if(tableData.get(i).getStatus()==1){
                dataRow.createCell(5).setCellValue("正常");
            }else if(tableData.get(i).getStatus()==2){
                dataRow.createCell(5).setCellValue("封禁");
            }else {
                dataRow.createCell(5).setCellValue("删除");
            }
        }

        // 将工作簿写入字节流(将Excel工作簿写入内存中的字节数组流中)
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        workbook.write(outputStream);

        // 设置响应头信息
        HttpHeaders headers = new HttpHeaders();
        //设置了响应的内容类型为application/octet-stream
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        //浏览器就会提示用户下载文件，并指定文件名为stationExcel.xlsx
        headers.setContentDispositionFormData("attachment", "stationExcel.xlsx");

        //使用ResponseEntity构建了一个带有响应头和响应体的HTTP响应对象。.ok()表示响应状态码为200，.headers(headers)设置了响应头
        // .body(outputStream.toByteArray())设置了响应体为outputStream中的字节数组
        return ResponseEntity.ok()
                .headers(headers)
                .body(outputStream.toByteArray());
    }

    /**
     * 导出采购|销售管理信息
     * @param tableData
     * @return
     * @throws IOException
     */
    @PostMapping(value = "/purchaseOrderExcel", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    public ResponseEntity<byte[]> purchaseOrderExcel(@RequestBody List<ZzhOrder> tableData) throws IOException {
        // 创建Excel工作簿和工作表
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("数据表");

        // 添加数据到工作表
        Row headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue("单据编号");
        headerRow.createCell(1).setCellValue("供应商|客户名称");
        headerRow.createCell(2).setCellValue("商品详情");
        headerRow.createCell(3).setCellValue("创建时间");
        headerRow.createCell(4).setCellValue("负责人");
        headerRow.createCell(5).setCellValue("商品数量");
        headerRow.createCell(6).setCellValue("合计金额");
        headerRow.createCell(7).setCellValue("优惠率");
        headerRow.createCell(8).setCellValue("优惠后金额");
        headerRow.createCell(9).setCellValue("状态");
        Row dataRow;

        for (int i = 0; i < tableData.size(); i++) {
            dataRow = sheet.createRow(i + 1);
            dataRow.createCell(0).setCellValue(tableData.get(i).getNumber());
            dataRow.createCell(1).setCellValue(tableData.get(i).getOrganName());
            dataRow.createCell(2).setCellValue(tableData.get(i).getMaterialName());
            dataRow.createCell(3).setCellValue(tableData.get(i).getCreateTime().toString());
            if(tableData.get(i).getCreatorName()!=null){
                dataRow.createCell(4).setCellValue(tableData.get(i).getCreatorName());
            }
            if(tableData.get(i).getOperNumber()!=null){
                dataRow.createCell(5).setCellValue(tableData.get(i).getOperNumber().toString());
            }
            dataRow.createCell(6).setCellValue(tableData.get(i).getAllPrice().toString());
            if(tableData.get(i).getDiscount()!=null){
                dataRow.createCell(7).setCellValue(tableData.get(i).getDiscount().toString()+"%");
            }else {
                dataRow.createCell(7).setCellValue("0%");
            }
            dataRow.createCell(8).setCellValue(tableData.get(i).getDiscountLastMoney().toString());
            if(tableData.get(i).getStatus().equals("1")){
                dataRow.createCell(9).setCellValue("已审核");
            }else if(tableData.get(i).getStatus().equals("2")){
                dataRow.createCell(9).setCellValue("完成采购|销售");
            }else {
                dataRow.createCell(9).setCellValue("未审核");
            }
        }

        // 将工作簿写入字节流(将Excel工作簿写入内存中的字节数组流中)
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        workbook.write(outputStream);

        // 设置响应头信息
        HttpHeaders headers = new HttpHeaders();
        //设置了响应的内容类型为application/octet-stream
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        //浏览器就会提示用户下载文件，并指定文件名为stationExcel.xlsx
        headers.setContentDispositionFormData("attachment", "stationExcel.xlsx");

        //使用ResponseEntity构建了一个带有响应头和响应体的HTTP响应对象。.ok()表示响应状态码为200，.headers(headers)设置了响应头
        // .body(outputStream.toByteArray())设置了响应体为outputStream中的字节数组
        return ResponseEntity.ok()
                .headers(headers)
                .body(outputStream.toByteArray());
    }

    /**
     * 导出仓库管理信息
     * @param tableData
     * @return
     * @throws IOException
     */
    @PostMapping(value = "/depotManageExcel", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    public ResponseEntity<byte[]> depotManageExcel(@RequestBody List<ZzhOrder> tableData) throws IOException {
        // 创建Excel工作簿和工作表
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("数据表");

        // 添加数据到工作表
        Row headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue("单据编号");
        headerRow.createCell(1).setCellValue("供应商|客户名称");
        headerRow.createCell(2).setCellValue("商品详情");
        headerRow.createCell(3).setCellValue("创建时间");
        headerRow.createCell(4).setCellValue("负责人");
        headerRow.createCell(5).setCellValue("商品数量");
        headerRow.createCell(6).setCellValue("单价");
        headerRow.createCell(7).setCellValue("合计金额");
        headerRow.createCell(8).setCellValue("状态");
        Row dataRow;

        for (int i = 0; i < tableData.size(); i++) {
            dataRow = sheet.createRow(i + 1);
            dataRow.createCell(0).setCellValue(tableData.get(i).getNumber());
            dataRow.createCell(1).setCellValue(tableData.get(i).getOrganName());
            dataRow.createCell(2).setCellValue(tableData.get(i).getMaterialName());
            dataRow.createCell(3).setCellValue(tableData.get(i).getCreateTime().toString());
            if(tableData.get(i).getCreatorName()!=null){
                dataRow.createCell(4).setCellValue(tableData.get(i).getCreatorName());
            }
            if(tableData.get(i).getOperNumber()!=null){
                dataRow.createCell(5).setCellValue(tableData.get(i).getOperNumber().toString());
            }
            dataRow.createCell(6).setCellValue(tableData.get(i).getUnitPrice().toString());
            dataRow.createCell(7).setCellValue(tableData.get(i).getAllPrice().toString());
            if(tableData.get(i).getStatus().equals("1")){
                dataRow.createCell(8).setCellValue("已审核");
            }else if(tableData.get(i).getStatus().equals("2")){
                dataRow.createCell(8).setCellValue("完成采购|销售");
            }else {
                dataRow.createCell(8).setCellValue("未审核");
            }
        }

        // 将工作簿写入字节流(将Excel工作簿写入内存中的字节数组流中)
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        workbook.write(outputStream);

        // 设置响应头信息
        HttpHeaders headers = new HttpHeaders();
        //设置了响应的内容类型为application/octet-stream
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        //浏览器就会提示用户下载文件，并指定文件名为stationExcel.xlsx
        headers.setContentDispositionFormData("attachment", "stationExcel.xlsx");

        //使用ResponseEntity构建了一个带有响应头和响应体的HTTP响应对象。.ok()表示响应状态码为200，.headers(headers)设置了响应头
        // .body(outputStream.toByteArray())设置了响应体为outputStream中的字节数组
        return ResponseEntity.ok()
                .headers(headers)
                .body(outputStream.toByteArray());
    }
}
